// Copyright Epic Games, Inc. All Rights Reserved.

#include "GameplayMessageProcessor.h"

#include "Engine/World.h"
#include "GameFramework/GameStateBase.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(GameplayMessageProcessor)

/**
 * 开始游戏时的初始化，调用父类BeginPlay并开始监听消息
 */
void UGameplayMessageProcessor::BeginPlay()
{
	Super::BeginPlay(); // 调用父类的BeginPlay

	StartListening(); // 开始监听消息
}

/**
 * 结束游戏时的清理，调用父类EndPlay并停止监听和移除所有监听器句柄
 * @param EndPlayReason 结束游戏的原因
 */
void UGameplayMessageProcessor::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason); // 调用父类的EndPlay

	StopListening(); // 停止监听消息

	// 移除所有监听器句柄
	UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); // 获取消息子系统实例
	for (FGameplayMessageListenerHandle& Handle : ListenerHandles) // 遍历所有监听器句柄
	{
		MessageSubsystem.UnregisterListener(Handle); // 取消注册监听器
	}
	ListenerHandles.Empty(); // 清空监听器句柄数组
}

/**
 * 开始监听消息（基类实现为空，派生类可以重写）
 */
void UGameplayMessageProcessor::StartListening()
{

}

/**
 * 停止监听消息（基类实现为空，派生类可以重写）
 */
void UGameplayMessageProcessor::StopListening()
{
}

/**
 * 添加监听器句柄到数组
 * @param Handle 要添加的监听器句柄
 */
void UGameplayMessageProcessor::AddListenerHandle(FGameplayMessageListenerHandle&& Handle)
{
	ListenerHandles.Add(MoveTemp(Handle)); // 移动语义添加句柄到数组
}

/**
 * 获取服务器时间
 * @return 服务器时间（秒），如果无法获取则返回0.0
 */
double UGameplayMessageProcessor::GetServerTime() const
{
	if (AGameStateBase* GameState = GetWorld()->GetGameState()) // 检查游戏状态是否存在
	{
		return GameState->GetServerWorldTimeSeconds(); // 返回服务器世界时间（秒）
	}
	else
	{
		return 0.0; // 无法获取时间时返回0.0
	}
}